package com.yfp.client.service;

import com.yfp.client.domain.ClientCoupon;
import com.yfp.client.domain.MarActivity;
import com.yfp.client.domain.dto.ActiviryAcquireDTO;
import com.yfp.client.domain.dto.ClientCouponBestDTO;
import com.yfp.client.domain.dto.OrderCreateDTO;
import com.yfp.client.domain.vo.*;
import com.yfp.client.domain.vo.ClientCouponOrderVO;
import com.yfp.client.domain.vo.ComboListVO;
import com.yfp.client.domain.vo.CouponPackVO;
import com.yfp.client.domain.vo.PopupVO;
import com.yfp.client.util.ResponseEnum;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 客户优惠券
 *
 * @CreateDate: 2024/7/16 18:58
 * @UpdateUser:
 * @UpdateDate: 2024/7/16 18:58
 * @UpdateRemark: 暂无修改
 * @Version: 1.0
 */
public interface ClientCouponService {

    /**
     * 查询优惠券
     *
     * @param couponId
     * @param clientId
     * @return
     */
    ClientCoupon findByCouponIdAndClientId(Long couponId, String clientId);

    /**
     * 查询优惠券
     *
     * @param id
     * @param clientId
     * @return
     */
    ClientCoupon findByIdAndClientId(Long id, String clientId);

    /**
     * 查询优惠券
     *
     * @param Id
     * @return
     */
    ClientCoupon findById(Long Id);

    /**
     * 是否弹窗领券
     *
     * @return
     */
    PopupVO popup(String clientId, String cityName);

    /**
     * 领取礼包
     * @param marketingId
     * @param clientId
     * @param cityName
     * @return
     */
    boolean acquireCouponPack(Long marketingId, String clientId, String cityName, Long miniBannerId);
    /**
     * 发券
     *
     * @param couponId
     * @param clientId
     * @return
     */
    ResponseEnum verifyCoupon(Long couponId, String clientId, Long couponPackId, String cityName, Long miniBannerId,Long storedActivityDetailId);

    /**
     * 校验是否可以发放
     * @param couponId
     * @param clientId
     * @return
     */
    boolean verifyCouponBoolean(Long couponId, String clientId, String cityName);

    /**
     * 领取优惠券
     *
     * @param couponId
     * @return
     */
    ResponseEnum acquire(Long couponId, String clientId, String cityName);

    /**
     * 活动领券
     *
     * @param activiryAcquireDTO
     * @return
     */
    ResponseEnum activiryAcquire(ActiviryAcquireDTO activiryAcquireDTO);

    MarActivity activity(ActiviryAcquireDTO activiryAcquireDTO);

    /**
     * 核销
     *
     * @param couponId
     * @param clientId
     * @return
     */
    ResponseEnum verification(Long couponId, String clientId);

    /**
     * 查询个人优惠券
     *
     * @param status
     * @param clientId
     * @return
     */
    List<ClientCoupon> findListByStatusAndClientId(Integer status, String clientId);

    /**
     * 订单详情-优惠券列表
     * 下单选择优惠券，展示用户所有的优惠券列表包含可使用、不可使用
     *
     * @param orderCreateDTO 查询条件
     * @return
     */
    ClientCouponOrderVO getClientCouponOrderList(OrderCreateDTO orderCreateDTO);

    /**
     * 获取用户可使用的优惠券列表
     *
     * @param orderCreateDTO 订单信息
     * @param clientCoupons  优惠券列表
     * @return
     */
    List<ClientCoupon> getAvailableCoupons(OrderCreateDTO orderCreateDTO, List<ClientCoupon> clientCoupons);

    /**
     * 计算最优的优惠券
     * 默认使用优惠金额最大或最接近达到使用条件的优惠券（若面额相同则优先使用先过期的券）
     *
     * @param priceOriginal 原价
     * @param clientCoupons 优惠券列表
     */
    ClientCouponBestDTO getBestClientCoupon(BigDecimal priceOriginal, List<ClientCoupon> clientCoupons);

    /**
     * 计算最优的优惠券
     * 默认使用优惠金额最大或最接近达到使用条件的优惠券（若面额相同则优先使用先过期的券）
     *
     * @param clientCouponDtoList 优惠券列表
     */
    ClientCouponBestDTO getBestSortClientCoupon(List<ClientCouponBestDTO> clientCouponDtoList);

    /**
     * 使用优惠券后，计算单个套餐的价格
     * (单品原价 / 订单总价格(原价)) ×优惠券金额 ≈ 单品优惠
     *
     * @param amount        单品原价
     * @param totalPrice    订单总价格(原价)
     * @param discountMoney 优惠券金额
     * @return 单品原价-单品优惠额
     */
    BigDecimal calculateDiscountMoney(BigDecimal amount, BigDecimal totalPrice, BigDecimal discountMoney);

    /**
     * 修改优惠券状态
     *
     * @param id
     * @param status
     */
    void updateStatusById(Long id, Integer status);

    /**
     * 获取优惠券倒计时
     * 当优惠券卡包里有任意一张优惠券有效期小于24h（有效期相同则取优惠力度最大的显示，两者相同取随机）
     *
     * @return
     */
    ClientCoupon getClientCouponCountdown();

    /**
     * 领券中心-上新图标是否展示
     *
     * @return
     */
    Boolean listNewIcon(String cityName);

    /**
     * 计算预估到手价格
     * 列表中的套餐需要分别判断，分别取优惠力度最大优惠券的预估金额
     *
     * @param machineId
     * @param machineComboVO
     * @return
     */
    List<ComboListVO> computeEstimatedPrice(String machineId, List<ComboListVO> machineComboVO);

    /**
     * 填充霸王免单优惠券的 discounts 优惠内容
     *
     * @param orderCreateDTO
     * @param availableCoupons
     * @return
     */
    List<ClientCoupon> fillBabyCouponDiscounts(OrderCreateDTO orderCreateDTO, List<ClientCoupon> availableCoupons);

    /**
     * 查询礼包详情
     * @param couponPackId
     * @return
     */
    CouponPackVO findCouponPack(Long couponPackId);

    /**
     * 查询领券中心的个人券
     * @param status
     * @param clientId
     * @return
     */
    List<ClientCoupon> findCouponCentre(Integer status, String clientId);

    List<ClientCoupon> findByIds(ArrayList<Long> marCouponIdList);

    List<ClientCoupon> getActivitySignInsClientRecordsById(String clientId, List<Long> activitySignInsClientRecordsIdList);
}